package COM.ACCP;

import sun.misc.Cleaner;

import java.lang.reflect.Field;
import java.util.Calendar;
import java.util.Date;

public class JSON {
    public  static String toJson(Object object){
        String string="{";
        //利用反射对象获取属性
        Field [] fields=object.getClass().getDeclaredFields();
        for (Field fd:fields){
            fd.setAccessible(true);
            if (fd.getType().getSimpleName().equals("Date")){
                Date date=null;
                //获取日期
                try {
                    date=(Date) fd.get(object);//日历类，操作日期
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                Calendar calendar=Calendar.getInstance();
                calendar.setTime(date);//设置日期
                string+=fd.getName()+":{year:"+calendar.get(Calendar.YEAR)+",mouth:"
                        +calendar.get(Calendar.MONDAY)+",date:"+calendar.get(Calendar.DATE)
                        +",hour:"+calendar.get(Calendar.HOUR)+",minute:"+calendar.get(Calendar.MINUTE)+
                        ",second:"+calendar.get(Calendar.SECOND)+"}";


            }
            try {
                string+=fd.getName()+":"+fd.get(object)+",";
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        string=string.substring(0,string.length()-1);
        string+="}";
        return string;
    }

    /**
     * 将json字符串 转对象
     * @param json 字符串
     * @param cla 对象类型
     * @param <T> 定义泛型的返回值的方法
     * @return
     */
    public static <T> T parseObject(String json,Class cla){
        //利用类型信息类
        Object object=null;
        json=json.substring(0,json.length()-1)+",}";
        Field [] fields=cla.getDeclaredFields();
        for (Field fd:fields){
            fd.setAccessible(true);
            //先检查属性在字符串中是否存在
            if (json.indexOf(fd.getName())!=-1){
                //获取属性在json涨幅创中的位子，判断属性是否存在
                 int pos=json.indexOf(fd.getName());
                 int endpos;
                    if (fd.getType().getSimpleName().equals("Date")) {
                        endpos=json.indexOf("}",pos)+1;
                        String res=json.substring(pos,endpos);
                        res=res.replace(fd.getName()+":","");
                        res=res.substring(1,res.length()-1);
                        //分割字符串【year:2019...】
                        System.out.println(res);
                        String[]dates=res.split(",");
                        //将分割后的字符串数组中的值再分割“year:2019”
                        Calendar cal=Calendar.getInstance();
                        int[] times=new int[6];
                        //[2019,5,10,11,19,30]
                        for (int i=0;i<times.length;i++){
                            times[i]=Integer.parseInt(dates[i].split(":")[1]);
                        }
                        //将时间转为水族中的值
                        cal.set(times[0],times[1],times[2],times[3],times[4],times[5]);
//                        fd.set(object,cal.getTime());
                    }
                     else {endpos=json.indexOf(",",pos);}
                     //取出对应的字符串，分割字符串取值
                String res=json.substring(pos,endpos);
                     String val=res.split(":")[1];
                     //再根据类型填充属性
                if (fd.getType().getSimpleName().equals("int")){
                    try {
                        fd.setInt(object,Integer.parseInt(val));
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
                else {fd.getType().getSimpleName();}


                }
//            System.out.println(fd.getName());}
        return (T)object;

    }
}
